package com.itany.corejava.code08_常用类.string;

/**
 * @author 石小俊
 * @date 2023年04月25日 10:18
 */
public class Test01_创建方式 {

    public static void main(String[] args) {
        // 方式一:直接创建
        // 该方式本身来说,不符合引用数据类型的特性,不符合面向对象的规范
        // 原则上来说,所有的引用数据类型都是通过new关键字进行创建的
        // 只有基本数据类型才能直接赋值
        // 由于String太过于常用,JVM对其做了优化
        // String是一种特殊的引用数据类型,支持直接赋值的方式
        // 直接赋值的方式进行比较时,只比较值,没有地址
        // 该方式的数据没有存储到堆中,而是存储在常量池中
        String s1 = "hello";
        String s2 = "hello";
        System.out.println(s1 == s2); // true

        // 方式二:使用构造方法创建
        // 创建一个空字符串,在堆中分配了空间,空间中没有值
        String s3 = new String();
        // 直接赋值为空字符串,没有在堆中创建空间
        String s4 = "";
        System.out.println(s3 == s4); // false
        System.out.println(s3.equals(s4));  // true
        // 将字符串的值赋值为null,此时在堆中没有创建空间
        String s5 = null;

        // 在堆中开辟一块空间,其存储的值为hello
        String s6 = new String("hello");
        System.out.println(s1 == s6);       // false
        System.out.println(s1.equals(s6));  // true

        // 字符串可以与任意类型进行拼接
        System.out.println(s1 + "world");
        System.out.println(s2 + true);
        System.out.println(s3 + 123);

    }

}
